home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / Calculators / Calculette / Source / Printer.m < prev   
Text File  |  1994-02-14  |  4KB  |  227 lines

  1. #import "Printer.h"
  2. #import "Calculette.h"
  3.  
  4. @implementation Printer
  5.  
  6. - text
  7. {
  8.   return text;
  9. }
  10.   
  11. - window
  12. {
  13.   return window;
  14. }
  15.  
  16. - (char *)file
  17. {
  18.   return file;
  19. }
  20.  
  21. - appendToText:(const char *)aText
  22. {
  23.   [ text replaceSel:aText ];
  24.  
  25.   [ text scrollSelToVisible ];
  26.   [ text display ];
  27.  
  28.   [ window setDocEdited:YES ];
  29.  
  30.   return self ;
  31. }
  32.  
  33. - setFile:(const char *)aFile
  34. {
  35.   if ( file == aFile )        /* revert to saved */
  36.     return self;
  37.  
  38.   if ( file )
  39.     free( file );
  40.  
  41.   file = strcpy( (char *)malloc( strlen( aFile ) + 1 ), aFile );
  42.  
  43.   [ window setTitle:rindex( file, '/' ) ? rindex( file, '/' ) + 1 : file ];
  44.  
  45.   return self;
  46. }
  47.  
  48. - load:(const char *)aFile
  49. {
  50.   NXStream *theStream = NXMapFile( aFile, NX_READONLY );
  51.   id ret = self;
  52.  
  53.   if ( theStream ) {
  54.     NX_DURING
  55.     [ text readRichText:theStream ];
  56.  
  57.     NX_HANDLER
  58.     switch ( NXLocalHandler.code ) {
  59.     case NX_illegalWrite:
  60.       NXRunAlertPanel( 0, "Illegal write on stream", 0, 0, 0 );
  61.       ret = nil;
  62.       break;
  63.     case NX_illegalRead:
  64.       NXRunAlertPanel( 0, "Illegal read on stream", 0, 0, 0 );
  65.       ret = nil;
  66.       break;
  67.     case NX_illegalSeek:
  68.       NXRunAlertPanel( 0, "Illegal seek on stream", 0, 0, 0 );
  69.       ret = nil;
  70.       break;
  71.     case NX_illegalStream:
  72.       NXRunAlertPanel( 0, "Invalid stream", 0, 0, 0 );
  73.       ret = nil;
  74.       break;
  75.     case NX_streamVMError:
  76.       NXRunAlertPanel( 0, "VM error on stream", 0, 0, 0 );
  77.       ret = nil;
  78.       break;
  79.     }
  80.     NX_ENDHANDLER
  81.  
  82.     NXCloseMemory( theStream, NX_FREEBUFFER );
  83.  
  84.     if ( ret ) {
  85.       [ self setFile:aFile ];
  86.       [ window setDocEdited:NO ];
  87.       [ text setSel:0 :0 ];
  88.     }
  89.  
  90.     return ret;
  91.   }
  92.   NXRunAlertPanel( 0, "The file %s cannot be opened. File system error: %s",
  93.           0, 0, 0, file, strerror( errno ));
  94.   return nil;
  95. }
  96.  
  97. - saveAs:sender
  98. {
  99.   SavePanel *savePanel = [ SavePanel new ];
  100.  
  101.   [ savePanel setRequiredFileType:"calculette" ];
  102.   if ( [ savePanel runModal ] != NX_OKTAG )
  103.     return nil;
  104.  
  105.   [ self setFile:[ savePanel filename ]];
  106.  
  107.   return [ self save:sender ];
  108. }
  109.  
  110. - save:sender
  111. {
  112.   int fd;
  113.   NXStream *theStream;
  114.  
  115.   if ( !file )
  116.     return [ self saveAs:sender ];
  117.  
  118.   if ( access( file, F_OK ) == 0 && access( file, W_OK ) != 0 )
  119.     if( NXRunAlertPanel( 0, "The file %s is write protected. Do you want to overwrite it?",
  120.             "Replace", "Cancel", 0, file ) != NX_ALERTDEFAULT )
  121.       return nil;
  122.  
  123.   if ( (fd = open( file, O_WRONLY|O_CREAT|O_TRUNC, 0666 )) < 0 ) {
  124.     NXRunAlertPanel( 0, "The file %s cannot be saved. File system error: %s",
  125.             0, 0, 0, file, strerror( errno ));
  126.     return nil;
  127.   }
  128.  
  129.   theStream = NXOpenFile( fd, NX_WRITEONLY );
  130.  
  131.   [ text writeRichText:theStream ];
  132.  
  133.   NXClose( theStream );
  134.   close( fd );
  135.   
  136.   [ window setDocEdited:NO ];
  137.  
  138.   return self;
  139. }
  140.  
  141. - revert:sender
  142. {
  143.   if ( !file )
  144.     return nil;
  145.  
  146.   if ( [ window isDocEdited ] )
  147.     if( NXRunAlertPanel( 0, "Do you want to discard changes to %s?",
  148.             "Revert", "Cancel", 0, file ) != NX_ALERTDEFAULT )
  149.       return nil;
  150.  
  151.   return [ self load:file ];
  152. }
  153.  
  154. - print:sender
  155. {
  156.   [ text printPSCode:nil ];
  157.   
  158.   return self;
  159. }
  160.  
  161. @end
  162.  
  163. @implementation Printer( WindowDelegate )
  164.  
  165. - windowDidBecomeKey:sender
  166. {
  167.   [[ NXApp delegate ] changePrinter:self ];
  168.  
  169.   return self;
  170. }
  171.  
  172. - windowWillClose:sender
  173. {
  174.   if ( [ sender isDocEdited ] ) {
  175.     const char *fname = file ? file : [ sender title ];
  176.  
  177.     if ( rindex( fname, '/' ))
  178.       fname = rindex( fname, '/' ) + 1;
  179.       
  180.       switch ( NXRunAlertPanel( "Close", "Save changes to %s?", "Save", "Don't Save", "Cancel", fname )) {
  181.       case NX_ALERTDEFAULT:
  182.         if ( ![ self save:nil ] )
  183.       return nil;
  184.     break;
  185.       case NX_ALERTOTHER:
  186.         return nil;
  187.       default:
  188.     break;
  189.       }
  190.   }
  191.  
  192.   [ sender setDelegate:nil ];
  193.  
  194.   [[ NXApp delegate ] removePrinter:self ];
  195.  
  196.   [ self free ];
  197.  
  198.   return self;
  199. }
  200.  
  201. - windowWillMiniaturize:sender toMiniwindow:miniwindow
  202. {
  203.   [ sender setMiniwindowIcon:"Miniprinter" ];
  204.  
  205.   return self;
  206. }
  207.  
  208. @end
  209.  
  210. @implementation Printer( TextDelegate )
  211.  
  212. - textDidGetKeys:sender isEmpty:(BOOL)flag
  213. {
  214.   [ window setDocEdited:YES ];
  215.  
  216.   return self;
  217. }
  218.  
  219. - textWillConvert:sender fromFont:from toFont:to
  220. {
  221.   [ window setDocEdited:YES ];
  222.  
  223.   return to;
  224. }
  225.  
  226. @end
  227.